package wili.b1;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import wili.attrMapping.file.JsonFile;
import wili.c.Ca;
import wili.c.Misc9a;
import wili.json.JsonLeaf;
import wili.json.JsonNode;

/**
 * 根据给定的json中的多行属性文本，查找其所在的json对象集。
 *
 * @author weila, 2022-10
 */
public class FindJsonObjByAttLines {
	/**
	 * objName(of atts) ~>full attNames of obj.
	 */
	Map<String, List<String>> attNamesMap;

	/**
	 * 在json中匹配的obj下查找匹配的若干属性行。
	 *
	 * @param objName 匹配相应名称的obj.
	 * @param has     必有若干属性行
	 * @param fileSt  json内容。
	 * @return
	 */
	public static String find(String objName, List<String> has, List<String> notHas, String fileSt) {
		FindJsonObjByAttLines obj = new FindJsonObjByAttLines();
		JsonFile file = new JsonFile(fileSt);
		List<String> lis = obj.find(objName, has, notHas, file);
		if (lis == null || lis.isEmpty())
			return "";
		String ret = lis.stream().collect(Collectors.joining("|"));
		//
		ret = "Found " + lis.size() + " result:";
		ret += lis.stream().map(e -> "\n" + e).collect(Collectors.joining(""));
		ret += "\nregularExp of guid:";
		ret += "\n" + lis.stream().collect(Collectors.joining("|")) + "";
		return ret;
	}

	public FindJsonObjByAttLines() {
	}

	/**
	 * 根据给定的json中的多行属性文本，查找其所在的json对象集。
	 */
	public List<String> find(String objName, List<String> has, List<String> notHas, JsonFile fromJsonFile) {
		/*
		 * >>> 展望，若有必要时： eg. 可用 attName:.\d+ 来对属性值进行正则匹配。 eg. 可用 attName:!abc
		 * 来对属性值进行非匹配。 eg. 可用 attName:!.(abc|def) 来对属性值进行非正则匹配。
		 */
		Map<String, String> hasMap = Misc9a.ssMapOfList(has, ":", e -> e.replaceAll("[\"',\\s]", ""));
		Map<String, String> notHasMap = Misc9a.ssMapOfList(notHas, ":", e -> e.replaceAll("[\"',\\s]", ""));
		List<JsonNode> editList = fromJsonFile.root.findAtts(false, objName, null);
		List<JsonNode> ret = new ArrayList<>();
		for (JsonNode edit : editList) {
			if (edit instanceof JsonLeaf)
				continue;
			String guid = edit.dad.son("guid").stringValue;
			Ca.log(-1, "guid100:", guid);
			if (guid.contains("8f0e3765-9dfc-42c0-a78d-bb580e9befbd"))
				Ca.pause();
			Map<String, String> sonMap = edit.toObj().getAttMap_ssMap(e -> e.replace("\"", ""));
			if (Misc9a.contains_ssMap_matchValue(sonMap, true, hasMap)) {
				if (Misc9a.contains_ssMap_matchValue(sonMap, false, notHasMap)) {
					ret.add(edit);
				}
			}
		}
		List<String> ret2 = ret.stream().map(ele -> "\"" + ele.dad.son("guid").stringValue + "\"")
				.collect(Collectors.toList());
		if (ret2.isEmpty())
			return ret2;
		return ret2;
	}

	static String[] compress_attLine(String st) {// 为方便匹配，去除空格、引号、末尾的逗号。
		st = st.replaceAll("\\s+", "").replace("\"", "").replaceFirst(",$", "");
		String[] tt = st.split(":");
		return tt;
		//		if (tt[0].equals(B1const.FORMULA)) {
		//			if (tt[1].matches("true|false")) {
		//			} else {
		//				tt[1] = "#formula#";
		//				st = tt[0] + ":" + tt[1];
		//			}
		//		}
		//		return st;
	}

	static void test() {
		File dir = new File("D:\\bearJ\\awilly\\src\\main\\java\\wili\\attMaping\\b1\\a0");
		File[] ff = dir.listFiles();
		/*
		
		 */
		String hasSt = "	defaultEditable: false\n"// 
				+ "		defaultEditableOnGrid: false\n"//
				+ "			formula: .+\n"//
				+ "				updatable: true";
		String notHasSt = "\"formulaGroup: .+\" "//
				+ "+ \"formula: true|false\""//
				+ " + \"formulaGroup :.+\"";
		String[] tt = hasSt.split("\n");
		List<String> has = Arrays.asList(tt);
		tt = notHasSt.split("\n");
		List<String> notHas = Arrays.asList(tt);
		FindJsonObjByAttLines obj = new FindJsonObjByAttLines();
		for (int i = 0; i < ff.length; i++) {
			if (ff[i].getName().endsWith(".txt.json"))
				continue;
			if (!ff[i].getName().endsWith(".json"))
				continue;
			Ca.log(">>> find from: " + ff[i].getName());
			JsonFile fil = new JsonFile(ff[i]);
			List<String> lis = obj.find("editable", has, notHas, fil);
			Ca.log(lis.toString());
		}
	}

	public static void main(String[] args) {
		test();
	}
}
